Atualmente, há uma enorme quantidade de dados sendo produzidos a todo instante. Para a manipulação e análise estatística desses dados é fundamental a aplicação de métodos que visem uma eficiência computacional. A Análise de Componentes Principais - PCA é uma técnica da estatística multivariada que permite que os dados sejam transformados fazendo combinações lineares das variáveis originais, considerando nesse processo a associação existente entre as variáveis. Essas combinações lineares geradas são chamadas de componentes principais. Por outro lado, a Análise de Componentes Independentes - ICA é uma técnica capaz de revelar fatores escondidos em conjuntos de sinais e define um modelo gerador para os dados observados, que são assumidos serem misturas de variáveis ocultas e desconhecidas. As variáveis latentes são assumidas mutuamente independentes, e são chamadas de componentes independentes ou fontes dos dados observados.
Neste trabalho, especificamente, serão realizadas as análises considerando três bancos de dados distintos: (1) Banco Pima; (2) Banco Parkinson e; (3) Banco Mine vs rock. Cada aba abaixo dispõe sobre a análise dos dados supracitados.
Esta base de dados contém 768 amostras, divididas em duas classes que representam a presença ou não de diabetes mellitus em mulheres:
# Leitura dos dados
pima <- read.delim("pima.txt", header=FALSE)
# Atribuição
x = pima
datatable(pima)
As classes são definidas em termos de 8 atributos numéricos e que trazem as informações:
Para a visualização gráfica entre as classes, utilizou-se os seguintes histogramas:
par(mfrow=c(2,5))
for(i in 1:8){
y = x[x[,classe]==0, i]
hist(y, col = 2)
y = x[x[,classe]==1, i]
hist(y, col = 3, add = T)
}
Conforme podemos observar nos histogramas, é evidenciado em cada variável há uma sobreposição de classes. Outro ponto identificado é de que todas as variáveis não são negativas.
Para avaliar a estrutura das variáveis, utilizou-se o gráfico de pontos bidimensional. Este gráfico tem como objetivo verificar uma possível relação linear entre os pares bivariados através de um gráfico de pontos das observações, conforme apresentado abaixo:
# Gráfico de pontos bidimensional
pairs(x[,-classe], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)
De acordo com o gráfico nota-se que não existe uma relação linear entre a maioria dos pares bivariados, tendo em vista que há uma grande sobreposição entre as classes.
1. Análise de Componentes Principais (PCA)
Inicialmente, iremos analisar a correlação entre as variáveis em estudo através da matriz de correlação e também graficamente:
# Matriz de correlação
corr_pima = round(cor(pima[,-classe]), 5)
datatable(corr_pima)
# Gráfico
corrplot(corr_pima)
Conforme podemos observar, a correlação entre as variáveis está entre baixa a moderada. Apenas alguns poucos atributos chegam quase a 55% de correlação. Visualmente é possível identificar através do gráfico que as variáveis \(V1\) e \(V8\) são as mais correlacionadas.
1.1 Selecionando duas variáveis
De forma ilustrativa optou-se por apresentar, no primeiro momento, uma redução das variáveis para ilustrar a aplicação da análise de componentes principais. Inicialmente, ao verificarmos a matriz de correlação nota-se que as variáveis \(V1\) e \(V8\) são as mais correlacionadas dentre os dados, com uma correlação correspondente a \(0,54434\). Quando retiramos somente estas variáveis do gráfico bivariado, podemos visualizá-las através do gráfico de dispersão a seguir:
# Variáveis selecionadas: V1 e V8
y = x[,c(1,8)]
plot(y,col=c(2,4)[x[,classe]],pch=19, cex=1.25)
Neste segundo momento iremos criar um modelo para as variáveis em análise \(V1\) e \(V8\):
# Variáveis selecionadas: V1 e V8
y = x[,c(1,8)]
resultado <- function(){
# Criando o modelo
mpca = prcomp(y);mpca
# Desvio padrão
s = mpca$sdev;s
# Variância
v = s^2;v
# Soma total das variâncias
sum_var_total = sum(v);sum_var_total
# Proporção de variâncias
prop_var = (v/sum_var_total)*100;prop_var
# Soma acumulada
Sum_Acumulada = cumsum(prop_var)
listafinal = list(Modelo=mpca, Resultados=data.frame(PC = c("PC1","PC2"),Variancia=v,DesvioPadrao=s,ProporcaoDaVariancia = prop_var,ProporcaoAcumulada=Sum_Acumulada))
return(listafinal)
}
resultado()
## $Modelo
## Standard deviations (1, .., p=2):
## [1] 11.910840 2.790876
##
## Rotation (n x k) = (2 x 2):
## PC1 PC2
## V1 -0.1630622 0.9866158
## V8 -0.9866158 -0.1630622
##
## $Resultados
## PC Variancia DesvioPadrao ProporcaoDaVariancia ProporcaoAcumulada
## 1 PC1 141.868115 11.910840 94.795444 94.79544
## 2 PC2 7.788987 2.790876 5.204556 100.00000
De acordo com os resultados obtidos no modelo, o desvio padrão já revela que o primeiro é maior do que o segundo: \(11,910840 > 2,790876\), logo, confirmamos a relação de que na análise de componentes principais as variâncias são decrescentes. Também podemos observar os pesos através dos autovetores de cada variável nas componentes principais através da matriz de rotação, a qual serve para fazer a transformação dos dados originais.
A análise de componentes principais indica que a primeira componente principal corresponde a \(94,795444\)% da variabilidade total. Ou seja, \(94,795444\)% da informação dos dados está contida somente nesta variável, enquanto apenas \(5,204556\)% da informação está contida na segunda.
Para analisar a estimativa das componentes principais, temos os seguintes resultados:
# Estimativa da componente principal
mpca = prcomp(y)
y.hat = predict(mpca,y)
datatable(y.hat)
Visualmente podemos comparar através dos seguintes gráficos:
# Gráfico comparativo
par(mfrow=c(1,2))
plot(y,col=c(2,4)[x[,9]],pch=19, cex=1.25)
plot(y.hat, col=c(2,4)[x[,9]],pch=19, cex=1.25)
Desta forma, podemos concluir que para as componentes PC 1 e PC 2 não há uma correlação, ao contrário das variáveis selecionadas \(V1\) e \(V8\).
1.2 Analisando todas as variáveis
Agora, iremos analisar considerando todas as variáveis com o intuito de criar o modelo e explorar as principais informações obtidas:
# Variáveis
y = x[,-classe]
resultado <- function(){
# Criando o modelo
mpca = prcomp(y);mpca
# Desvio padrão
s = mpca$sdev;s
# Variância
v = s^2;v
# Soma total das variâncias
sum_var_total = sum(v);sum_var_total
# Proporção de variâncias
prop_var = round((v/sum_var_total),8)*100;prop_var
# Soma acumulada
Sum_Acumulada = cumsum(prop_var)
var = "PC"
PC = paste(var, 1:length(y));PC
listafinal = list(Modelo=mpca, Resultados=data.frame(PC =PC,Variancia=v,DesvioPadrao=s,ProporcaoDaVariancia = prop_var,ProporcaoAcumulada=Sum_Acumulada))
return(listafinal)
}
resultado()
## $Modelo
## Standard deviations (1, .., p=8):
## [1] 116.0024697 30.5411220 19.7630421 14.0777374 10.6155129 6.7697447
## [7] 2.7858049 0.3207351
##
## Rotation (n x k) = (8 x 8):
## PC1 PC2 PC3 PC4 PC5
## V1 -0.0020217659 0.0226488861 -0.022464900 0.049045960 -0.1516128736
## V2 0.0978115765 0.9722100405 0.143428710 -0.119830016 0.0879407680
## V3 0.0160930503 0.1419093303 -0.922467192 0.262742788 0.2321650088
## V4 0.0607566861 -0.0578614699 -0.307013055 -0.884369380 -0.2599734875
## V5 0.9931108438 -0.0946266913 0.020977302 0.065550362 0.0001723122
## V6 0.0140108085 0.0469729766 -0.132444542 -0.192801728 -0.0214744823
## V7 0.0005371679 0.0008168046 -0.000639983 -0.002699086 -0.0016408068
## V8 -0.0035647443 0.1401681812 -0.125454310 0.301024330 -0.9205049033
## PC6 PC7 PC8
## V1 0.005047309 0.9866729948 -0.0061012325
## V2 -0.050739181 0.0008834261 0.0008254595
## V3 -0.075636552 -0.0012297595 -0.0005208655
## V4 -0.221363068 -0.0003764447 0.0025487191
## V5 0.006133265 0.0014230739 0.0002689659
## V6 0.970776708 -0.0027304621 0.0026734186
## V7 0.002029037 -0.0063440297 -0.9999721465
## V8 0.015113324 -0.1625553433 0.0019527197
##
## $Resultados
## PC Variancia DesvioPadrao ProporcaoDaVariancia ProporcaoAcumulada
## 1 PC 1 13456.572981 116.0024697 88.854663 88.85466
## 2 PC 2 932.760132 30.5411220 6.159078 95.01374
## 3 PC 3 390.577831 19.7630421 2.579012 97.59275
## 4 PC 4 198.182691 14.0777374 1.308614 98.90137
## 5 PC 5 112.689115 10.6155129 0.744094 99.64546
## 6 PC 6 45.829443 6.7697447 0.302615 99.94808
## 7 PC 7 7.760709 2.7858049 0.051244 99.99932
## 8 PC 8 0.102871 0.3207351 0.000679 100.00000
De acordo com os resultados obtidos no modelo, o desvio padrão apresenta um comportamento decrescente: \(116,0024697 > 30,5411220 > 19,7630421 > 14,0777374 > 10,6155129 > 6,7697447 > 2,7858049 > 0,3207351\), logo, confirmamos a relação de que na análise de componentes principais as variâncias são decrescentes. Também podemos observar os pesos através dos autovetores de cada variável nas componentes principais através da matriz de rotação, a qual serve para fazer a transformação dos dados originais.
A análise de componentes principais indica que a primeira componente principal corresponde a \(88,85466\)% da variabilidade total. Ou seja, \(88,85466\)% da informação dos dados está contida somente nesta variável. A segunda componente acumula com a primeira \(95,01374\)% da variabilidade total. Desta forma, podemos selecionar apenas as duas primeiras componentes principais por apresentarem uma alta variabilidade. Assim, diminuímos de uma dimensão 8 para uma dimensão 2, o que implica em um aumento na eficiência computacional.
Para analisar a estimativa das componentes principais, temos os seguintes resultados:
# Estimativa da componente principal
mpca = prcomp(y)
y.hat = round(predict(mpca,y),5)
datatable(y.hat)
Visualmente podemos comparar através dos seguintes gráficos:
# Gráfico comparativo
pairs(y, col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)
pairs(y.hat, col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)
Desta forma, faz-se a redução das variáveis considerando apenas as duas primeiras componentes principais:
pairs(y.hat[,1:2], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)
A redução de dimensionalidade é uma etapa fundamental para diminuir a complexidade e aumentar a eficácia dos classificadores. Assim, de acordo com as avaliações experimentais obteve-se resultados positivos no que se refere a redução da dimensão dos dados, entretanto, no que diz respeito à separação de classes, para o problema tratado aqui, a PCA não obteve uma distinção evidente e clara das classes.
2. Análise de Componentes Independentes (ICA)
Considerando os dados deste banco como uma matriz de 768 linhas e 8 atributos numéricos, aplicaremos a ICA. Devido a grande quantidade de informações, optou-se por representar os resultados somente através de gráficos:
Matriz S - Matriz de estimativas do sinal de origem;
Matriz M - Matriz de mistura estimada;
Matriz W - Matriz de não-mistura estimada (inversa da matriz M);
Matriz Y - Matriz de dados branqueados;
Matriz Q - Matriz de branqueamento;
Matriz R - Matriz de rotação ortogonal.
par(mfrow=c(2,3))
ICA = icafast(x, nc=ncol(x))
plot(ICA$S, pch=19, cex=1.25, main="Matriz S")
plot(ICA$M, pch=19, cex=1.25,main="Matriz M")
plot(ICA$W, pch=19, cex=1.25, main="Matriz W")
plot(ICA$Y, pch=19, cex=1.25,main="Matriz Y")
plot(ICA$Q, pch=19, cex=1.25, main="Matriz Q")
plot(ICA$R, pch=19, cex=1.25,main="Matriz R")
Obtem-se as componentes independentes e sua representação gráfica será:
# ICA
y_ICA = as.matrix(x) %*% t(ICA$W)
pairs(y_ICA[,1:2], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)
Em comparação com os dados originais e os obtidos através da Análise de Componentes Principais (PCA), é possível verificar que os dados na Análise de Componentes Independentes (ICA) também permanecem sem distinção mais evidente das classes.
Esta base de dados contém 195 amostras, divididas em duas classes as quais é discriminado as pessoas saudáveis das que possuem a doença de parkinson, sendo:
# Leitura dos dados
parkinson <- read.delim("parkinson.txt", header=FALSE)
# Atribuição
x = parkinson
datatable(parkinson)
Para a análise de classes univariada, podemos visualizar o comportamento das variáveis através dos seguintes histogramas:
par(mfrow=c(4,6))
for(i in 1:22){
y = x[x[,classe]==2, i]
hist(y, col = 2,ylim = c(0,50))
y = x[x[,classe]==1, i]
hist(y, col = 3, add = T)
}
Conforme podemos observar nos histogramas, é evidenciado em cada variável há uma sobreposição de classes. Outro ponto identificado é de que todas as variáveis não são negativas.
Para avaliar a estrutura das variáveis, utilizou-se o gráfico de correlação com o objetivo verificar uma possível relação linear entre os pares bivariados, conforme apresentado abaixo:
# Gráfico
corr_parkinson = cor(parkinson[,-classe])
corrplot(corr_parkinson)
De acordo com o gráfico podemos observar a correlação entre as variáveis apresentam uma parcela expressiva de correlações fortes na região central. Desta forma, para uma melhor visualização, elaborou-se um gráfico de pontos bidimensional entre as variáveis mais correlacionadas no centro, conforme abaixo:
# Pontos Bidimensional
pairs(x[4:16], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)
Visualmente é possível identificar através do gráfico que as variáveis \(V9\) e \(V10\), por exemplo, são altamente correlacionadas, conforme pode ser visualizado através do gráfico de dispersão destas:
# Variáveis selecionadas: V9 e V10
y = x[,c(9,10)]
plot(y,col=c(2,4)[x[,classe]],pch=19, cex=1.25)
Desta forma, é possível observar uma relação linear positiva entre as variáveis apresentadas no gráfico.
1. Análise de Componentes Principais (PCA)
# Matriz de correlação
corr_parkinson = cor(parkinson[,-classe])
datatable(corr_parkinson)
Conforme podemos observar, a correlação entre as variáveis é considerada alta em parte expressiva dos pares bivariados. Alguns valores são tão próximos de 1, que um possível arredodamento nos dados poderia influenciar no resultado final.
1.1 Selecionando duas variáveis
De forma ilustrativa optou-se por apresentar, no primeiro momento, uma redução das variáveis para mostrar a aplicação da análise de componentes principais. Inicialmente, ao verificarmos a matriz de correlação e o gráfico de pontos bivariado notou-se, por exemplo, que as variáveis \(V9\) e \(V10\) são altamente correlacionadas, com uma correlação correspondente a \(0,9872578\) e, além disso, há uma distinção mais evidente entre as classes.
Portanto, neste segundo momento iremos criar um modelo para as variáveis em análise \(V9\) e \(V10\):
# Variáveis selecionadas: V9 e V10
y = x[,c(9,10)]
resultado <- function(){
# Criando o modelo
mpca = prcomp(y);mpca
# Desvio padrão
s = mpca$sdev
# Variância
v = s^2
# Soma total das variâncias
sum_var_total = sum(v)
# Proporção de variâncias
prop_var = (v/sum_var_total)*100
# Soma acumulada
Sum_Acumulada = cumsum(prop_var)
listafinal = list(Modelo=mpca, Resultados=data.frame(PC = c("PC1","PC2"),Variancia=v,DesvioPadrao=s,ProporcaoDaVariancia = prop_var,ProporcaoAcumulada=Sum_Acumulada))
return(listafinal)
}
resultado()
## $Modelo
## Standard deviations (1, .., p=2):
## [1] 0.195764704 0.002987081
##
## Rotation (n x k) = (2 x 2):
## PC1 PC2
## V9 -0.09511934 0.99546588
## V10 -0.99546588 -0.09511934
##
## $Resultados
## PC Variancia DesvioPadrao ProporcaoDaVariancia ProporcaoAcumulada
## 1 PC1 3.832382e-02 0.195764704 99.97672316 99.97672
## 2 PC2 8.922650e-06 0.002987081 0.02327684 100.00000
De acordo com os resultados obtidos no modelo, o desvio padrão já revela que o primeiro é maior do que o segundo: \(0,195764704 > 0,002987081\), logo, confirmamos a relação de que na análise de componentes principais as variâncias são decrescentes. Também podemos observar os pesos através dos autovetores de cada variável nas componentes principais através da matriz de rotação, a qual serve para fazer a transformação dos dados originais.
A análise de componentes principais indica que a primeira componente principal corresponde a \(99,97672316\)% da variabilidade total. Ou seja, \(99,97672316\)%da informação dos dados está contida somente nesta variável, enquanto apenas \(0,02327684\)% da informação está contida na segunda.
Para analisar a estimativa das componentes principais, temos os seguintes resultados:# Estimativa da componente principal
mpca = prcomp(y)
y.hat = predict(mpca,y)
datatable(y.hat)
Visualmente podemos comparar através dos seguintes gráficos:
# Gráfico comparativo
par(mfrow=c(1,2))
plot(y,col=c(2,4)[x[,classe]],pch=19, cex=1.25)
plot(y.hat, col=c(2,4)[x[,classe]],pch=19, cex=1.25)
Desta forma, podemos concluir que para as componentes PC 1 e PC 2 não há uma correlação, ao contrário das variáveis selecionadas \(V9\) e \(V10\), que são altamente correlacionadas.
1.2 Analisando todas as variáveis
Agora, iremos analisar considerando todas as variáveis com o intuito de criar o modelo e explorar as principais informações obtidas:
# Variáveis
y = x[,-classe]
resultado <- function(){
# Criando o modelo
mpca = prcomp(y)
# Desvio padrão
s = mpca$sdev
# Variância
v = s^2
# Soma total das variâncias
sum_var_total = sum(v)
# Proporção de variâncias
prop_var = round((v/sum_var_total),8)*100
# Soma acumulada
Sum_Acumulada = cumsum(prop_var)
var = "PC"
PC = paste(var, 1:length(y))
listafinal = list(Resultados=data.frame(PC=PC,Variancia=v,DesvioPadrao=s,ProporcaoDaVariancia = prop_var,ProporcaoAcumulada=Sum_Acumulada))
return(listafinal)
}
resultado()
## $Resultados
## PC Variancia DesvioPadrao ProporcaoDaVariancia ProporcaoAcumulada
## 1 PC 1 8.747145e+03 9.352617e+01 72.899269 72.89927
## 2 PC 2 2.618706e+03 5.117329e+01 21.824461 94.72373
## 3 PC 3 6.133968e+02 2.476685e+01 5.112088 99.83582
## 4 PC 4 1.912333e+01 4.373023e+00 0.159375 99.99519
## 5 PC 5 4.798595e-01 6.927189e-01 0.003999 99.99919
## 6 PC 6 7.335045e-02 2.708329e-01 0.000611 99.99980
## 7 PC 7 1.226807e-02 1.107613e-01 0.000102 99.99990
## 8 PC 8 5.642697e-03 7.511789e-02 0.000047 99.99995
## 9 PC 9 3.173374e-03 5.633270e-02 0.000026 99.99998
## 10 PC 10 1.385912e-03 3.722783e-02 0.000012 99.99999
## 11 PC 11 5.373450e-04 2.318070e-02 0.000004 99.99999
## 12 PC 12 4.235205e-04 2.057961e-02 0.000004 100.00000
## 13 PC 13 7.081227e-05 8.415003e-03 0.000001 100.00000
## 14 PC 14 1.591830e-05 3.989775e-03 0.000000 100.00000
## 15 PC 15 7.723414e-06 2.779103e-03 0.000000 100.00000
## 16 PC 16 3.062283e-06 1.749938e-03 0.000000 100.00000
## 17 PC 17 5.035618e-07 7.096209e-04 0.000000 100.00000
## 18 PC 18 2.053431e-07 4.531480e-04 0.000000 100.00000
## 19 PC 19 5.845390e-08 2.417724e-04 0.000000 100.00000
## 20 PC 20 2.612557e-11 5.111318e-06 0.000000 100.00000
## 21 PC 21 6.535729e-12 2.556507e-06 0.000000 100.00000
## 22 PC 22 5.372718e-12 2.317912e-06 0.000000 100.00000
De acordo com os resultados obtidos no modelo, o desvio padrão apresenta um comportamento decrescente, com valor máximo de \(93,5262 > 51,1733 > 24,7668 > 4,3730 > ... > 2,317912e^{-6}\), logo, confirmamos a relação de que na análise de componentes principais as variâncias são decrescentes.
A análise de componentes principais indica que a primeira componente principal corresponde a \(72,899269\)% da variabilidade total. Ou seja, \(72,899269\)% da informação dos dados está contida somente nesta variável. A segunda componente acumula com a primeira \(94,72373\)% da variabilidade total. Desta forma, podemos selecionar apenas as duas primeiras componentes principais por apresentarem uma alta variabilidade. Assim, diminuímos de uma dimensão 22 para uma dimensão 2, o que implica em um aumento na eficiência computacional.
Para analisar a estimativa das componentes principais, temos os seguintes resultados:# Estimativa da componente principal
mpca = prcomp(y)
y.hat = predict(mpca,y)
datatable(y.hat)
Visualmente podemos comparar através dos seguintes gráficos:
# Gráfico comparativo
corr_parkinson = cor(parkinson[,-classe])
mpca = prcomp(y)
y.hat = predict(mpca,y)
cor_y.hat = cor(y.hat)
par(mfrow=c(1,2))
corrplot(corr_parkinson)
corrplot(cor_y.hat)
Assim, podemos verificar que, de fato, não existe correlação entre as componentes principais estimadas.
Desta forma, faz-se a redução das variáveis considerando apenas as duas primeiras componentes principais:
pairs(y.hat[,1:2], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)
A redução de dimensionalidade é uma etapa fundamental para diminuir a complexidade e aumentar a eficácia dos classificadores. Assim, de acordo com as avaliações experimentais obteve-se resultados positivos no que se refere a redução da dimensão dos dados, entretanto, no que diz respeito à separação de classes, para o problema tratado aqui, a PCA não obteve uma distinção muito evidente e clara das classes.
2. Análise de Componentes Independentes (ICA)
Considerando os dados deste banco como uma matriz de 195 linhas e 22 atributos numéricos, aplicaremos a ICA. Devido a grande quantidade de informações, optou-se por representar os resultados somente através de gráficos:
Matriz S - Matriz de estimativas do sinal de origem;
Matriz M - Matriz de mistura estimada;
Matriz W - Matriz de não-mistura estimada (inversa da matriz M);
Matriz Y - Matriz de dados branqueados;
Matriz Q - Matriz de branqueamento;
Matriz R - Matriz de rotação ortogonal.
par(mfrow=c(2,3))
ICA = icafast(x, nc=ncol(x))
plot(ICA$S, pch=19, cex=1.25, main="Matriz S")
plot(ICA$M, pch=19, cex=1.25,main="Matriz M")
plot(ICA$W, pch=19, cex=1.25, main="Matriz W")
plot(ICA$Y, pch=19, cex=1.25,main="Matriz Y")
plot(ICA$Q, pch=19, cex=1.25, main="Matriz Q")
plot(ICA$R, pch=19, cex=1.25,main="Matriz R")
Obtem-se as componentes independentes e sua representação gráfica será:
# ICA
y_ICA = as.matrix(x) %*% t(ICA$W)
pairs(y_ICA[,1:2], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)
Em comparação com os dados originais e os obtidos através da Análise de Componentes Principais (PCA), é possível verificar que os dados na Análise de Componentes Independentes (ICA) também permanecem sem distinção mais evidente das classes.
Esta base de dados contém 208 amostras, divididas em duas classes discriminadas entre os sinais de sonar que ricocheteiam em um cilindro de metal e os ricocheteiam em uma rocha, sendo:
As classes são definidas em termos de 60 atributos numéricos e que trazem as informações sobre os entrevistados na pesquisa.
# Leitura dos dados
mine_rock <- read.delim("mine_rock.txt", header=FALSE)
# Atribuição
x = mine_rock
datatable(mine_rock)
Para a análise de classes univariada, podemos visualizar o comportamento das variáveis através dos seguintes histogramas subdivididos em blocos para melhor visualização:
par(mfrow=c(4,5))
for(i in 1:20){
y = x[x[,classe]==2, i]
hist(y, col = 2,ylim = c(0,50))
y = x[x[,classe]==1, i]
hist(y, col = 3, add = T)
}
par(mfrow=c(4,5))
for(i in 21:40){
y = x[x[,classe]==2, i]
hist(y, col = 2,ylim = c(0,50))
y = x[x[,classe]==1, i]
hist(y, col = 3, add = T)
}
par(mfrow=c(4,5))
for(i in 41:60){
y = x[x[,classe]==2, i]
hist(y, col = 2,ylim = c(0,50))
y = x[x[,classe]==1, i]
hist(y, col = 3, add = T)
}
Conforme podemos observar nos histogramas, é evidenciado em cada variável há uma sobreposição de classes. Outro ponto identificado é de que todas as variáveis não são negativas.
# Gráfico
corr_mine_rock = cor(mine_rock[,-classe])
corrplot(corr_mine_rock)
De acordo com o gráfico podemos observar a correlação entre as variáveis apresentam uma parcela expressiva de correlações fortes em torno da diagonal principal. Visualmente é possível identificar através do gráfico que as variáveis \(V15\) e \(V16\), por exemplo, são altamente correlacionadas, conforme pode ser visualizado através do gráfico de dispersão destas:
# Variáveis selecionadas: V15 e V16
y = x[,c(15,16)]
plot(y,col=c(2,4)[x[,classe]],pch=19, cex=1.25)
Desta forma, é possível observar uma relação linear positiva entre as variáveis apresentadas no gráfico.
1. Análise de Componentes Principais (PCA)
# Matriz de correlação
corr_mine_rock = cor(mine_rock[,-classe])
datatable(corr_mine_rock)
Conforme podemos observar, a correlação entre as variáveis é em sua maioria considerada entre média a alta em parte expressiva dos pares bivariados.
1.1 Selecionando duas variáveis
De forma ilustrativa optou-se por apresentar, no primeiro momento, uma redução das variáveis para ilustrar a aplicação da análise de componentes principais. Inicialmente, ao verificarmos a matriz de correlação notou-se, por exemplo, que as variáveis \(V15\) e \(V16\) são altamente correlacionadas, com uma correlação correspondente a \(0,9126254\).
Portanto, neste segundo momento iremos criar um modelo para as variáveis em análise \(V15\) e \(V16\):
# Variáveis selecionadas: V15 e V16
y = x[,c(15,16)]
resultado <- function(){
# Criando o modelo
mpca = prcomp(y);mpca
# Desvio padrão
s = mpca$sdev;s
# Variância
v = s^2;v
# Soma total das variâncias
sum_var_total = sum(v);sum_var_total
# Proporção de variâncias
prop_var = (v/sum_var_total)*100;prop_var
# Soma acumulada
Sum_Acumulada = cumsum(prop_var)
listafinal = list(Modelo=mpca, Resultados=data.frame(PC = c("PC1","PC2"),Variancia=v,DesvioPadrao=s,ProporcaoDaVariancia = prop_var,ProporcaoAcumulada=Sum_Acumulada))
return(listafinal)
}
resultado()
## $Modelo
## Standard deviations (1, .., p=2):
## [1] 0.30362065 0.06434819
##
## Rotation (n x k) = (2 x 2):
## PC1 PC2
## V15 0.6574755 0.7534759
## V16 0.7534759 -0.6574755
##
## $Resultados
## PC Variancia DesvioPadrao ProporcaoDaVariancia ProporcaoAcumulada
## 1 PC1 0.09218550 0.30362065 95.701388 95.70139
## 2 PC2 0.00414069 0.06434819 4.298612 100.00000
De acordo com os resultados obtidos no modelo, o desvio padrão já revela que o primeiro é maior do que o segundo: \(0,30362065 > 0,06434819\), logo, confirmamos a relação de que na análise de componentes principais as variâncias são decrescentes. Também podemos observar os pesos através dos autovetores de cada variável nas componentes principais através da matriz de rotação, a qual serve para fazer a transformação dos dados originais.
A análise de componentes principais indica que a primeira componente principal corresponde a \(95,701388\)% da variabilidade total. Ou seja, \(95,701388\)% da informação dos dados está contida somente nesta variável, enquanto apenas \(4,298612\)% da informação está contida na segunda.
Para analisar a estimativa das componentes principais, temos os seguintes resultados:
# Estimativa da componente principal
mpca = prcomp(y)
y.hat = predict(mpca,y)
datatable(y.hat)
Visualmente podemos comparar através dos seguintes gráficos:
# Gráfico comparativo
par(mfrow=c(1,2))
plot(y,col=c(2,4)[x[,classe]],pch=19, cex=1.25)
plot(y.hat, col=c(2,4)[x[,classe]],pch=19, cex=1.25)
Desta forma, podemos concluir que para as componentes PC 1 e PC 2 não há uma correlação, ao contrário das variáveis selecionadas \(V15\) e \(V16\), que são altamente correlacionadas. Outro ponto relevante diz respeito a visível sobreposição de classes.
1.2 Analisando todas as variáveis
Agora, iremos analisar considerando todas as variáveis com o intuito de criar o modelo e explorar as principais informações obtidas:
# Variáveis
y = x[,-classe]
resultado <- function(){
# Criando o modelo
mpca = prcomp(y)
# Desvio padrão
s = mpca$sdev;s
# Variância
v = s^2;v
# Soma total das variâncias
sum_var_total = sum(v);sum_var_total
# Proporção de variâncias
prop_var = round((v/sum_var_total),8)*100;prop_var
# Soma acumulada
Sum_Acumulada = cumsum(prop_var)
var = "PC"
PC = paste(var, 1:length(y));PC
listafinal = list(Resultados=data.frame(PC=PC,Variancia=v,DesvioPadrao=s,ProporcaoDaVariancia = prop_var,ProporcaoAcumulada=Sum_Acumulada))
return(listafinal)
}
resultado()
## $Resultados
## PC Variancia DesvioPadrao ProporcaoDaVariancia ProporcaoAcumulada
## 1 PC 1 5.588520e-01 0.747564057 31.971149 31.97115
## 2 PC 2 3.562935e-01 0.596903291 20.383060 52.35421
## 3 PC 3 1.495547e-01 0.386723086 8.555820 60.91003
## 4 PC 4 1.129082e-01 0.336018165 6.459322 67.36935
## 5 PC 5 9.026885e-02 0.300447753 5.164156 72.53351
## 6 PC 6 7.780999e-02 0.278944425 4.451402 76.98491
## 7 PC 7 7.355004e-02 0.271201105 4.207696 81.19261
## 8 PC 8 4.601845e-02 0.214519125 2.632652 83.82526
## 9 PC 9 3.898078e-02 0.197435516 2.230037 86.05529
## 10 PC 10 3.359315e-02 0.183284329 1.921817 87.97711
## 11 PC 11 2.736142e-02 0.165412877 1.565309 89.54242
## 12 PC 12 2.375992e-02 0.154142539 1.359272 90.90169
## 13 PC 13 2.045395e-02 0.143017310 1.170142 92.07183
## 14 PC 14 1.672477e-02 0.129324296 0.956801 93.02863
## 15 PC 15 1.526561e-02 0.123554089 0.873325 93.90196
## 16 PC 16 1.339824e-02 0.115750750 0.766495 94.66845
## 17 PC 17 1.257574e-02 0.112141594 0.719440 95.38790
## 18 PC 18 9.886534e-03 0.099431051 0.565595 95.95349
## 19 PC 19 9.217387e-03 0.096007224 0.527314 96.48080
## 20 PC 20 8.532273e-03 0.092370305 0.488120 96.96892
## 21 PC 21 6.395960e-03 0.079974746 0.365904 97.33483
## 22 PC 22 5.128546e-03 0.071613870 0.293397 97.62823
## 23 PC 23 4.683146e-03 0.068433516 0.267916 97.89614
## 24 PC 24 4.195055e-03 0.064769247 0.239993 98.13613
## 25 PC 25 4.056054e-03 0.063687158 0.232041 98.36817
## 26 PC 26 3.773819e-03 0.061431420 0.215895 98.58407
## 27 PC 27 2.733375e-03 0.052281690 0.156373 98.74044
## 28 PC 28 2.455871e-03 0.049556748 0.140497 98.88094
## 29 PC 29 2.268432e-03 0.047628055 0.129774 99.01071
## 30 PC 30 2.069714e-03 0.045494115 0.118405 99.12912
## 31 PC 31 1.690653e-03 0.041117555 0.096720 99.22584
## 32 PC 32 1.589436e-03 0.039867729 0.090929 99.31677
## 33 PC 33 1.330604e-03 0.036477448 0.076122 99.39289
## 34 PC 34 1.265016e-03 0.035567066 0.072370 99.46526
## 35 PC 35 1.223605e-03 0.034980063 0.070001 99.53526
## 36 PC 36 1.138808e-03 0.033746234 0.065150 99.60041
## 37 PC 37 9.576650e-04 0.030946162 0.054787 99.65520
## 38 PC 38 9.181038e-04 0.030300228 0.052523 99.70772
## 39 PC 39 8.521980e-04 0.029192430 0.048753 99.75647
## 40 PC 40 7.065658e-04 0.026581306 0.040422 99.79690
## 41 PC 41 6.895917e-04 0.026260079 0.039451 99.83635
## 42 PC 42 6.344712e-04 0.025188711 0.036297 99.87264
## 43 PC 43 4.806888e-04 0.021924615 0.027500 99.90014
## 44 PC 44 4.080856e-04 0.020201129 0.023346 99.92349
## 45 PC 45 3.365843e-04 0.018346234 0.019256 99.94275
## 46 PC 46 2.597476e-04 0.016116686 0.014860 99.95761
## 47 PC 47 1.601862e-04 0.012656470 0.009164 99.96677
## 48 PC 48 1.375515e-04 0.011728235 0.007869 99.97464
## 49 PC 49 1.241934e-04 0.011144207 0.007105 99.98174
## 50 PC 50 8.051009e-05 0.008972741 0.004606 99.98635
## 51 PC 51 5.559273e-05 0.007456053 0.003180 99.98953
## 52 PC 52 4.340291e-05 0.006588088 0.002483 99.99201
## 53 PC 53 3.244466e-05 0.005696021 0.001856 99.99387
## 54 PC 54 2.644564e-05 0.005142533 0.001513 99.99538
## 55 PC 55 2.145421e-05 0.004631869 0.001227 99.99661
## 56 PC 56 1.862001e-05 0.004315091 0.001065 99.99767
## 57 PC 57 1.371542e-05 0.003703433 0.000785 99.99846
## 58 PC 58 1.180285e-05 0.003435528 0.000675 99.99913
## 59 PC 59 9.359878e-06 0.003059392 0.000535 99.99967
## 60 PC 60 5.807808e-06 0.002409939 0.000332 100.00000
De acordo com os resultados obtidos no modelo, o desvio padrão apresenta um comportamento decrescente, com valor máximo de \(0,747564057 > 0,596903291 > 0,386723086 > ... > 0,002409939\), logo, confirmamos a relação de que na análise de componentes principais as variâncias são decrescentes.
A análise de componentes principais indica que a primeira componente principal corresponde a \(31,971149\)% da variabilidade total. Ou seja, \(31,971149\)% da informação dos dados está contida somente nesta variável. A segunda componente acumula com a primeira \(52,35421\)% da variabilidade total. Desta forma, analisando as informações obtidas, podemos selecionar as 12 primeiras componentes principais por apresentarem uma alta variabilidade. Assim, diminuímos de uma dimensão 60 para uma dimensão 12, o que implica em um aumento na eficiência computacional.
Para analisar a estimativa das componentes principais, temos os seguintes resultados:# Estimativa da componente principal
mpca = prcomp(y)
y.hat = predict(mpca,y)
datatable(y.hat)
Se formos analisar a correlação das estimativas, estas podem ser verificadas através do seguinte gráfico:
cor_y.hat = cor(y.hat)
corrplot(cor_y.hat)
Assim, podemos verificar que, de fato, não existe correlação entre as componentes principais estimadas.
Desta forma, faz-se a redução das variáveis considerando apenas as 12 primeiras componentes principais:
pairs(y.hat[,1:12], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)
A redução de dimensionalidade é uma etapa fundamental para diminuir a complexidade e aumentar a eficácia dos classificadores. Assim, de acordo com as avaliações experimentais obteve-se resultados positivos no que se refere a redução da dimensão dos dados, entretanto, no que diz respeito à separação de classes, para o problema tratado aqui, a PCA não obteve uma distinção muito evidente e clara das classes.
2. Análise de Componentes Independentes (ICA)
Considerando os dados deste banco como uma matriz de 208 linhas e 60 atributos numéricos, aplicaremos a ICA. Devido a grande quantidade de informações, optou-se por representar os resultados somente através de gráficos:
Matriz S - Matriz de estimativas do sinal de origem;
Matriz M - Matriz de mistura estimada;
Matriz W - Matriz de não-mistura estimada (inversa da matriz M);
Matriz Y - Matriz de dados branqueados;
Matriz Q - Matriz de branqueamento;
Matriz R - Matriz de rotação ortogonal.
par(mfrow=c(2,3))
ICA = icafast(x, nc=ncol(x))
plot(ICA$S, pch=19, cex=1.25, main="Matriz S")
plot(ICA$M, pch=19, cex=1.25,main="Matriz M")
plot(ICA$W, pch=19, cex=1.25, main="Matriz W")
plot(ICA$Y, pch=19, cex=1.25,main="Matriz Y")
plot(ICA$Q, pch=19, cex=1.25, main="Matriz Q")
plot(ICA$R, pch=19, cex=1.25,main="Matriz R")
Obtem-se as componentes independentes e sua representação gráfica será:
# ICA
y_ICA = as.matrix(x) %*% t(ICA$W)
pairs(y_ICA[,1:12], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)
Em comparação com os dados originais e os obtidos através da Análise de Componentes Principais (PCA), é possível verificar que os dados na Análise de Componentes Independentes (ICA) estão geometricamente um pouco mais separados e com uma distinção mais evidente das classes (embora ainda ocorra a sobreposição).